forked from open-feature/js-sdk
-
Notifications
You must be signed in to change notification settings - Fork 0
feat: Consolidate Multi-Provider Code to Shared Package #1
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Draft
jonathannorris
wants to merge
44
commits into
DevCycleHQ-Sandbox:feat-migrate-multi-provider
Choose a base branch
from
open-feature:feat-shared-multi-provider
base: feat-migrate-multi-provider
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Draft
feat: Consolidate Multi-Provider Code to Shared Package #1
jonathannorris
wants to merge
44
commits into
DevCycleHQ-Sandbox:feat-migrate-multi-provider
from
open-feature:feat-shared-multi-provider
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
03c26d7 to
5f966fd
Compare
Cleanup: removing `release-as` properties from release-please config
after successfully validating OIDC npm publishing.
<!-- av pr metadata
This information is embedded by the av CLI when creating PRs to track
the status of stacks when using Aviator. Please do not delete or edit
this section of the PR.
```
{"parent":"main","parentHead":"","trunk":"main"}
```
-->
Signed-off-by: Jonathan Norris <jonathan@taplytics.com>
This PR migrates the `MultiProvider` functionality from the [js-sdk-contrib](https://github.com/open-feature/js-sdk-contrib) repository into the main js-sdk, providing built-in support for multi-provider evaluation strategies. Addresses #1217 ### What's Changed - **Added `MultiProvider`** for server SDK with support for multiple evaluation strategies - **Added `WebMultiProvider`** for web SDK with web-specific optimizations - **Included 3 evaluation strategies**: FirstMatch, FirstSuccessful, and Comparison - **Comprehensive test coverage** for both server and web implementations - **Updated documentation** with usage examples and strategy explanations ### Testing - ✅ All existing tests pass - ✅ New comprehensive test suites for both server and web MultiProvider - ✅ ESLint compliance across all new code --------- Signed-off-by: Jonathan Norris <jonathan@taplytics.com>
92cf47a to
847278f
Compare
…ror logging (#1267) Addresses feedback from #1265 (Gemini bot review comments). ## Changes 1. **Fixed documentation mismatch**: Updated all code examples to use `MultiProvider` instead of incorrect `WebMultiProvider` class name - `packages/web/README.md` (4 occurrences) - `packages/web/src/provider/multi-provider/README.md` (4 occurrences) 2. **Removed duplicate error logging**: Fixed redundant stack trace logging in `hook-executor.ts` where errors were being logged twice in both `errorHooks` and `finallyHooks` methods <!-- av pr metadata This information is embedded by the av CLI when creating PRs to track the status of stacks when using Aviator. Please do not delete or edit this section of the PR. ``` {"parent":"main","parentHead":"","trunk":"main"} ``` --> Signed-off-by: Jonathan Norris <jonathan@taplytics.com>
🤖 I have created a release *beep* *boop* --- ## [1.20.0](server-sdk-v1.19.0...server-sdk-v1.20.0) (2025-10-21) ### ✨ New Features * Migrate MultiProvider from js-sdk-contrib ([#1234](#1234)) ([8686dbf](8686dbf)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com>
🤖 I have created a release *beep* *boop* --- ## [1.7.0](web-sdk-v1.6.2...web-sdk-v1.7.0) (2025-10-21) ### ✨ New Features * Migrate MultiProvider from js-sdk-contrib ([#1234](#1234)) ([8686dbf](8686dbf)) ### 🐛 Bug Fixes * correct MultiProvider class name in docs and remove duplicate error logging ([#1267](#1267)) ([18c2719](18c2719)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com> Signed-off-by: Michael Beemer <beeme1mr@users.noreply.github.com> Co-authored-by: Michael Beemer <beeme1mr@users.noreply.github.com>
## Description Adds the `Multi-Provider` feature to the features list in both the server and web SDK package READMEs. Signed-off-by: Jonathan Norris <jonathan@taplytics.com>
Signed-off-by: Todd Baert <todd.baert@dynatrace.com>
## This PR
👋 Maybe I'm missing something, but `useOpenFeatureClient` currently
returns an unstable `client` that is recreated every time the provider
re-renders, if you pass a domain into the provider instead of a specific
client.
This PR wraps the creation of that client when a domain is passed in
`useMemo`, which should ensure that it is then stable for downstream
usage via the `useOpenFeatureClient` hook.
As an example, due to `client` being unstable (combined with the
`shouldRunNow` behaviour in the client), this logs `ready` every time
the provider re-renders rather than just once when the client is
actually ready.
```ts
const client = useOpenFeatureClient();
useEffect(() => {
const ready = () => {
console.log('ready');
};
client.addHandler(ProviderEvents.Ready, ready);
return () => {
client.removeHandler(ProviderEvents.Ready, ready);
};
}, [client]);
```
The closest workaround I've found currently is checking if the domain
matches w/ `useState` + `useEffect`:
```ts
const client = useOpenFeatureClient();
const [stableClient, setStableClient] = useState(client);
useEffect(() => {
setStableClient((existing) => (existing.metadata.domain === client.metadata.domain ? existing : client));
}, [client]);
useEffect(() => {
const ready = () => {
console.log('ready');
};
stableClient.addHandler(ProviderEvents.Ready, ready);
return () => {
stableClient.removeHandler(ProviderEvents.Ready, ready);
};
}, [stableClient]);
---------
Signed-off-by: Matt Cowley <me@mattcowley.co.uk>
Signed-off-by: MattIPv4 <me@mattcowley.co.uk>
## This PR Failure first appeared in https://github.com/open-feature/js-sdk/actions/runs/18692818359/job/53302526714 -- noticed it locally while adding the test in #1276, and then saw the failure on main when my PR was merged. Signed-off-by: MattIPv4 <me@mattcowley.co.uk>
🤖 I have created a release *beep* *boop* --- ## [1.7.1](web-sdk-v1.7.0...web-sdk-v1.7.1) (2025-10-31) ### 📚 Documentation * add Multi-Provider to features list in README's ([#1269](#1269)) ([752fa0d](752fa0d)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com>
This PR contains the following updates: | Package | Change | Age | Confidence | |---|---|---|---| | [typescript](https://www.typescriptlang.org/) ([source](https://redirect.github.com/microsoft/TypeScript)) | [`5.8.3` -> `5.9.3`](https://renovatebot.com/diffs/npm/typescript/5.8.3/5.9.3) | [](https://docs.renovatebot.com/merge-confidence/) | [](https://docs.renovatebot.com/merge-confidence/) | --- ### Release Notes <details> <summary>microsoft/TypeScript (typescript)</summary> ### [`v5.9.3`](https://redirect.github.com/microsoft/TypeScript/releases/tag/v5.9.3): TypeScript 5.9.3 [Compare Source](https://redirect.github.com/microsoft/TypeScript/compare/v5.9.2...v5.9.3) Note: this tag was recreated to point at the correct commit. The npm package contained the correct content. For release notes, check out the [release announcement](https://devblogs.microsoft.com/typescript/announcing-typescript-5-9/) - [fixed issues query for Typescript 5.9.0 (Beta)](https://redirect.github.com/Microsoft/TypeScript/issues?utf8=%E2%9C%93\&q=milestone%3A%22TypeScript+5.9.0%22+is%3Aclosed+). - [fixed issues query for Typescript 5.9.1 (RC)](https://redirect.github.com/Microsoft/TypeScript/issues?utf8=%E2%9C%93\&q=milestone%3A%22TypeScript+5.9.1%22+is%3Aclosed+). - *No specific changes for TypeScript 5.9.2 (Stable)* - [fixed issues query for Typescript 5.9.3 (Stable)](https://redirect.github.com/Microsoft/TypeScript/issues?utf8=%E2%9C%93\&q=milestone%3A%22TypeScript+5.9.3%22+is%3Aclosed+). Downloads are available on: - [npm](https://www.npmjs.com/package/typescript) ### [`v5.9.2`](https://redirect.github.com/microsoft/TypeScript/releases/tag/v5.9.2): TypeScript 5.9 [Compare Source](https://redirect.github.com/microsoft/TypeScript/compare/v5.8.3...v5.9.2) Note: this tag was recreated to point at the correct commit. The npm package contained the correct content. For release notes, check out the [release announcement](https://devblogs.microsoft.com/typescript/announcing-typescript-5-9/) - [fixed issues query for Typescript 5.9.0 (Beta)](https://redirect.github.com/Microsoft/TypeScript/issues?utf8=%E2%9C%93\&q=milestone%3A%22TypeScript+5.9.0%22+is%3Aclosed+). - [fixed issues query for Typescript 5.9.1 (RC)](https://redirect.github.com/Microsoft/TypeScript/issues?utf8=%E2%9C%93\&q=milestone%3A%22TypeScript+5.9.1%22+is%3Aclosed+). - *No specific changes for TypeScript 5.9.2 (Stable)* Downloads are available on: - [npm](https://www.npmjs.com/package/typescript) </details> --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/open-feature/js-sdk). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MS45Ny4xMCIsInVwZGF0ZWRJblZlciI6IjQxLjE1Ni4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119--> Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
🤖 I have created a release *beep* *boop* --- ## [1.0.2](react-sdk-v1.0.1...react-sdk-v1.0.2) (2025-10-31) ### 🐛 Bug Fixes * memoize React client to provide stability ([#1276](#1276)) ([405d61d](405d61d)) ### 🧹 Chore * mention debounce hook in react/ng docs ([#1272](#1272)) ([27666b8](27666b8)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com>
- update copyright to OpenFeature Maintainers --------- Signed-off-by: Jonathan Norris <jonathan@taplytics.com>
<!-- Please use this template for your pull request. --> <!-- Please use the sections that you need and delete other sections --> ## This PR Fixing an issue with the MultiProvider where hook contexts and hints were being lost due to copies of the context data being created in the OpenFeature sdk evaluation. Since key evaluation of Maps using objects is done by reference, the lookup of the context during evaluation was failing, leading to errors. - adds this new feature ### Related Issues Fixes #1268 ### Notes ### Follow-up Tasks ### How to test --------- Signed-off-by: Mike Kitzman <mdkitzman@gmail.com>
…on with googleapis/release-please-action (#1278) This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [google-github-actions/release-please-action](https://redirect.github.com/google-github-actions/release-please-action) → [googleapis/release-please-action](https://redirect.github.com/google-github-actions/release-please-action) | action | replacement | `v3` -> `v3` | This is a special PR that replaces `google-github-actions/release-please-action` with the community suggested minimal stable replacement version. --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/open-feature/js-sdk). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MS4xNTkuNCIsInVwZGF0ZWRJblZlciI6IjQyLjE2LjEiLCJ0YXJnZXRCcmFuY2giOiJtYWluIiwibGFiZWxzIjpbXX0=--> Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
This PR: - clarifies some doc around `useWhenProviderReady` (it really only works with READY) - moves AbortController instantiation so we don't create it every render if we don't need to Signed-off-by: Todd Baert <todd.baert@dynatrace.com>
## This PR - updated the `isEqual` function to compare any input - updated the compare to evaluate the whole EvaluationDetails object instead of just the value ### Related Issues Fixes #1286 ### Notes This may trigger slightly more re-renders but I feel that that's better than return stale EvaluationDetails data which has proven to be confusing to folks attempting to debug unexpected evaluations. --------- Signed-off-by: Michael Beemer <beeme1mr@users.noreply.github.com>
## This PR Allows for `setContext` returned by the `useContextMutator` hook to be passed a method that returns the new context, with the current (previous) context passed into it. This aligns the signature of `setContext` to the setter of a regular `useState` hook, making it easier to conditionally update the context without needing to keep track of the domain separately from the React context. --------- Signed-off-by: MattIPv4 <me@mattcowley.co.uk>
…y] (#1304) > **Note:** This PR body was truncated due to platform limits. This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [@angular/compiler](https://redirect.github.com/angular/angular) ([source](https://redirect.github.com/angular/angular/tree/HEAD/packages/compiler)) | [`20.1.2` -> `20.3.15`](https://renovatebot.com/diffs/npm/@angular%2fcompiler/20.1.2/20.3.15) |  |  | ### GitHub Vulnerability Alerts #### [CVE-2025-66412](https://redirect.github.com/angular/angular/security/advisories/GHSA-v4hv-rgfq-gp49) A **Stored Cross-Site Scripting ([XSS](https://angular.dev/best-practices/security#preventing-cross-site-scripting-xss))** vulnerability has been identified in the **Angular Template Compiler**. It occurs because the compiler's internal security schema is incomplete, allowing attackers to bypass Angular's built-in security sanitization. Specifically, the schema fails to classify certain URL-holding attributes (e.g., those that could contain [`javascript:` URLs](https://developer.mozilla.org/en-US/Web/URI/Reference/Schemes/javascript)) as requiring strict URL security, enabling the injection of malicious scripts. Additionally, a related vulnerability exists involving SVG animation elements (`<animate>`, `<set>`, `<animateMotion>`, `<animateTransform>`). The `attributeName` attribute on these elements was not properly validated, allowing attackers to dynamically target security-sensitive attributes like `href` or `xlink:href` on other elements. By binding `attributeName` to "href" and providing a `javascript:` URL in the `values` or `to` attribute, an attacker could bypass sanitization and execute arbitrary code. Attributes confirmed to be vulnerable include: * SVG-related attributes: (e.g., `xlink:href`), and various MathML attributes (e.g., `math|href`, `annotation|href`). * SVG animation `attributeName` attribute when bound to "href" or "xlink:href". When template binding is used to assign untrusted, user-controlled data to these attributes (e.g., `[attr.xlink:href]="maliciousURL"` or `<animate [attributeName]="'href'" [values]="maliciousURL">`), the compiler incorrectly falls back to a non-sanitizing context or fails to block the dangerous attribute assignment. This allows an attacker to inject a `javascript:URL` payload. Upon user interaction (like a click) on the element, or automatically in the case of animations, the malicious JavaScript executes in the context of the application's origin. ### Impact When exploited, this vulnerability allows an attacker to execute arbitrary code within the context of the vulnerable application's domain. This enables: * **Session Hijacking:** Stealing session cookies and authentication tokens. * **Data Exfiltration:** Capturing and transmitting sensitive user data. * **Unauthorized Actions:** Performing actions on behalf of the user. ### Patches - 19.2.17 - 20.3.15 - 21.0.2 ### Attack Preconditions * The victim's Angular application must render data derived from **untrusted input** (e.g., from a database or API) and bind it to one of the unsanitized URL attributes or the `attributeName` of an SVG animation element. * The victim must perform a **user interaction** (e.g., clicking) on the compromised element for the stored script to execute, or the animation must trigger the execution. ### Workarounds If you cannot upgrade, you can workaround the issue by ensuring that any data bound to the vulnerable attributes is never sourced from untrusted user input (e.g., database, API response, URL parameters). * **Avoid Affected Template Bindings:** Specifically avoid using template bindings (e.g., `[attr.xlink:href]="maliciousURL"`) to assign untrusted data to the vulnerable SVG/MathML attributes. * **Avoid Dynamic `attributeName` on SVG Animations:** Do not bind untrusted data to the `attributeName` attribute of SVG animation elements (`<animate>`, `<set>`, etc.). * **Enable [Content Security Policy (CSP)](https://angular.dev/best-practices/security#content-security-policy):** Configure a robust CSP header that disallows `javascript:` URLs. --- ### Release Notes <details> <summary>angular/angular (@​angular/compiler)</summary> ### [`v20.3.15`](https://redirect.github.com/angular/angular/blob/HEAD/CHANGELOG.md#20315-2025-12-01) [Compare Source](https://redirect.github.com/angular/angular/compare/20.3.14...20.3.15) ##### compiler | Commit | Type | Description | | ------------------------------------------------------------------------------------------------ | ---- | ----------------------------------------------------------------- | | [d1ca8ae043](https://redirect.github.com/angular/angular/commit/d1ca8ae04390f050039fdb653a6147d75d48f81e) | fix | prevent XSS via SVG animation `attributeName` and MathML/SVG URLs | <!-- CHANGELOG SPLIT MARKER --> ### [`v20.3.14`](https://redirect.github.com/angular/angular/blob/HEAD/CHANGELOG.md#20314-2025-11-25) [Compare Source](https://redirect.github.com/angular/angular/compare/20.3.13...20.3.14) ##### http | Commit | Type | Description | | ------------------------------------------------------------------------------------------------ | ---- | ---------------------------------------------------- | | [0276479e7d](https://redirect.github.com/angular/angular/commit/0276479e7d0e280e0f8d26fa567d3b7aa97a516f) | fix | prevent XSRF token leakage to protocol-relative URLs | <!-- CHANGELOG SPLIT MARKER --> ### [`v20.3.13`](https://redirect.github.com/angular/angular/blob/HEAD/CHANGELOG.md#20313-2025-11-19) [Compare Source](https://redirect.github.com/angular/angular/compare/20.3.12...20.3.13) <!-- CHANGELOG SPLIT MARKER --> ### [`v20.3.12`](https://redirect.github.com/angular/angular/blob/HEAD/CHANGELOG.md#20312-2025-11-14) [Compare Source](https://redirect.github.com/angular/angular/compare/20.3.11...20.3.12) <!-- CHANGELOG SPLIT MARKER --> ### [`v20.3.11`](https://redirect.github.com/angular/angular/blob/HEAD/CHANGELOG.md#20311-2025-11-12) [Compare Source](https://redirect.github.com/angular/angular/compare/20.3.10...20.3.11) ##### common | Commit | Type | Description | | ------------------------------------------------------------------------------------------------ | ---- | ------------------------------------------------------- | | [5047849a4a](https://redirect.github.com/angular/angular/commit/5047849a4a1857471b78b7ba874f39ecd6175a6b) | fix | remove placeholder image listeners once view is removed | ##### compiler | Commit | Type | Description | | ------------------------------------------------------------------------------------------------ | ---- | -------------------------------------------------- | | [f9d0818087](https://redirect.github.com/angular/angular/commit/f9d08180876eb0aee5e5c489be734b07a7cc664e) | fix | support arbitrary nesting in :host-context() | | [106b9040df](https://redirect.github.com/angular/angular/commit/106b9040dfe03bd8deb0eabccc29e07f734b6ab5) | fix | support commas in :host() argument | | [9419ea348a](https://redirect.github.com/angular/angular/commit/9419ea348a296b50f13ac2e23ea9a00b336989b8) | fix | support complex selectors in :nth-child() | | [036c5d2a07](https://redirect.github.com/angular/angular/commit/036c5d2a073f8e48704ec0d405ca997eedb721e9) | fix | support one additional level of nesting in :host() | ##### core | Commit | Type | Description | | ------------------------------------------------------------------------------------------------ | ---- | ----------------------------------- | | [dcdd1bcdbb](https://redirect.github.com/angular/angular/commit/dcdd1bcdbbd2a2fb4bd1fc4330259824d0bc8cb9) | fix | skip leave animations on view swaps | <!-- CHANGELOG SPLIT MARKER --> ### [`v20.3.10`](https://redirect.github.com/angular/angular/releases/tag/20.3.10) [Compare Source](https://redirect.github.com/angular/angular/compare/20.3.9...20.3.10) ##### compiler-cli | Commit | Description | | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------ | | [](https://redirect.github.com/angular/angular/commit/840db59dc1a9beb0b4e63799b5d56c2f096a1bab) | make required inputs diagnostic less noisy | ##### migrations | Commit | Description | | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------- | | [](https://redirect.github.com/angular/angular/commit/a45e6b2b66f669c532d6bffbab65058edabcacd9) | Prevent removal of templates referenced with preceding whitespace characters | ### [`v20.3.9`](https://redirect.github.com/angular/angular/blob/HEAD/CHANGELOG.md#2039-2025-10-29) [Compare Source](https://redirect.github.com/angular/angular/compare/20.3.7...20.3.9) <!-- CHANGELOG SPLIT MARKER --> ### [`v20.3.7`](https://redirect.github.com/angular/angular/blob/HEAD/CHANGELOG.md#2037-2025-10-22) [Compare Source](https://redirect.github.com/angular/angular/compare/20.3.6...20.3.7) ##### animations | Commit | Type | Description | | ------------------------------------------------------------------------------------------------ | ---- | -------------------------------------------------------------------------------------------------- | | [bd38cd45a5](https://redirect.github.com/angular/angular/commit/bd38cd45a5fb81e92b91e582d7b13aa3b21f3839) | fix | account for `Element.animate` exceptions ([#​64506](https://redirect.github.com/angular/angular/pull/64506)) | ##### compiler | Commit | Type | Description | | ------------------------------------------------------------------------------------------------ | ---- | ------------------------------------------------------------------------------------------------------ | | [891f180262](https://redirect.github.com/angular/angular/commit/891f18026243bcf8c8b82881a73dffa283d0dd11) | fix | correctly compile long numeric HTML entities ([#​64297](https://redirect.github.com/angular/angular/pull/64297)) | ##### compiler-cli | Commit | Type | Description | | ------------------------------------------------------------------------------------------------ | ---- | ------------------------------------------------------------------------------------------------------------------------ | | [371274bfc6](https://redirect.github.com/angular/angular/commit/371274bfc6d5690390f90161106b60d80939fe75) | fix | missingStructuralDirective diagnostic produces false negatives ([#​64470](https://redirect.github.com/angular/angular/pull/64470)) | ##### core | Commit | Type | Description | | ------------------------------------------------------------------------------------------------ | ---- | ----------------------------------------------------------------------------------------------------------------------------------------- | | [4c89a267c3](https://redirect.github.com/angular/angular/commit/4c89a267c3b49e928332232ec2a3023f6fb4046d) | fix | pass element removal property through in all locations ([#​64565](https://redirect.github.com/angular/angular/pull/64565)) | | [2fad4d4ab6](https://redirect.github.com/angular/angular/commit/2fad4d4ab63a2a8326af02b0f2f7d285c7f42e0d) | fix | prevent duplicate nodes from being retained with fast \`animate.leave\`\` calls ([#​64592](https://redirect.github.com/angular/angular/pull/64592)) | ##### router | Commit | Type | Description | | ------------------------------------------------------------------------------------------------ | ---- | ----------------------------------------------------------------------------------------------------------------------- | | [cfd8ed3fff](https://redirect.github.com/angular/angular/commit/cfd8ed3fff02af93b3fbd2e3f3a47128bd3582bf) | fix | Fix outlet serialization and parsing with no primary children ([#​64505](https://redirect.github.com/angular/angular/pull/64505)) | | [182fe78f91](https://redirect.github.com/angular/angular/commit/182fe78f91d04ac8d25a32bce0ea180a6fe557ce) | fix | Surface parse errors in Router.parseUrl ([#​64503](https://redirect.github.com/angular/angular/pull/64503)) | <!-- CHANGELOG SPLIT MARKER --> ### [`v20.3.6`](https://redirect.github.com/angular/angular/blob/HEAD/CHANGELOG.md#2036-2025-10-16) [Compare Source](https://redirect.github.com/angular/angular/compare/20.3.5...20.3.6) ##### core | Commit | Type | Description | | ------------------------------------------------------------------------------------------------ | ---- | ------------------------------------------------------------------------------------- | | [911d6822cb](https://redirect.github.com/angular/angular/commit/911d6822cb18dabf4f72312dfc2e2ef9904bf6c2) | fix | update animation scheduling ([#​64441](https://redirect.github.com/angular/angular/pull/64441)) | ##### platform-browser | Commit | Type | Description | | ------------------------------------------------------------------------------------------------ | ---- | ------------------------------------------------------------------------------------------------------------------------------------------- | | [2ece42866d](https://redirect.github.com/angular/angular/commit/2ece42866d0ee8240e73ebcef79ba47378777368) | fix | `DomEventsPlugin` should always be the last plugin to be called for `supports()`. ([#​50394](https://redirect.github.com/angular/angular/pull/50394)) | <!-- CHANGELOG SPLIT MARKER --> ### [`v20.3.5`](https://redirect.github.com/angular/angular/blob/HEAD/CHANGELOG.md#2035-2025-10-15) [Compare Source](https://redirect.github.com/angular/angular/compare/20.3.4...20.3.5) ##### compiler-cli | Commit | Type | Description | | ------------------------------------------------------------------------------------------------ | ---- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- | | [8dec92ff9f](https://redirect.github.com/angular/angular/commit/8dec92ff9f1055c6b4fc4e767d8b1b408ac28e67) | fix | capture metadata for undecorated fields ([#​63957](https://redirect.github.com/angular/angular/pull/63957)) ([#​64317](https://redirect.github.com/angular/angular/pull/64317)) | | [c2e817b0ef](https://redirect.github.com/angular/angular/commit/c2e817b0efb6f617312936b756ace2c85139d1fc) | perf | fix performance of "interpolated signal not invoked" check ([#​64410](https://redirect.github.com/angular/angular/pull/64410)) | ##### core | Commit | Type | Description | | ------------------------------------------------------------------------------------------------ | ---- | --------------------------------------------------------------------------------------------------------------- | | [f15cfa4cc4](https://redirect.github.com/angular/angular/commit/f15cfa4cc414f1d2f4b126bdfc26d74922732672) | fix | fixes regression in `animate.leave` function bindings ([#​64413](https://redirect.github.com/angular/angular/pull/64413)) | | [d54dd674ca](https://redirect.github.com/angular/angular/commit/d54dd674ca9db874c95027161b8080bd37250af6) | fix | Prevents early style pruning with leave animations ([#​64335](https://redirect.github.com/angular/angular/pull/64335)) | ##### migrations | Commit | Type | Description | | ------------------------------------------------------------------------------------------------ | ---- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | [554573e524](https://redirect.github.com/angular/angular/commit/554573e5248a72f73df1468e992da08ce5f6112d) | fix | migrating input with more than 1 usage in a method ([#​64367](https://redirect.github.com/angular/angular/pull/64367)) | | [2c79ca0b57](https://redirect.github.com/angular/angular/commit/2c79ca0b579d99346c267e6b61789699e8656dc5) | fix | remove error for no matching files in control flow migration ([#​64253](https://redirect.github.com/angular/angular/pull/64253)) ([#​64314](https://redirect.github.com/angular/angular/pull/64314)) | ##### router | Commit | Type | Description | | ------------------------------------------------------------------------------------------------ | ---- | ------------------------------------------------------------------------------------------------------------------------------ | | [6e4bcc7d22](https://redirect.github.com/angular/angular/commit/6e4bcc7d22d4699a33d6648e628fb65a38d0ad8f) | fix | Scroll restoration should use instant scroll behavior for traversals ([#​64299](https://redirect.github.com/angular/angular/pull/64299)) | <!-- CHANGELOG SPLIT MARKER --> ### [`v20.3.4`](https://redirect.github.com/angular/angular/blob/HEAD/CHANGELOG.md#2034-2025-10-08) [Compare Source](https://redirect.github.com/angular/angular/compare/20.3.3...20.3.4) ##### core | Commit | Type | Description | | ------------------------------------------------------------------------------------------------ | ---- | ---------------------------------------------------------------------------------------------------------------------------------------- | | [853ed169a8](https://redirect.github.com/angular/angular/commit/853ed169a8a1392ef2da7790181fb8e100f59519) | fix | ensure missing leave animations don't queue leave animations ([#​64226](https://redirect.github.com/angular/angular/pull/64226)) | | [6fed986b7a](https://redirect.github.com/angular/angular/commit/6fed986b7a8f22dfe81d94b1e55490a278e6d82a) | fix | Fixes animations in conjunction with content projection ([#​63776](https://redirect.github.com/angular/angular/pull/63776)) | | [76fe5599fe](https://redirect.github.com/angular/angular/commit/76fe5599fe8e034c2a5a432608785a53018e23d2) | fix | handle undefined CSS time values in parseCssTimeUnitsToMs function ([#​64181](https://redirect.github.com/angular/angular/pull/64181)) | | [3b959105be](https://redirect.github.com/angular/angular/commit/3b959105be04d7b11a1eb1035f1938bd0c43fe8b) | fix | prevent early exit from leave animations when multiple transitions are present ([#​64225](https://redirect.github.com/angular/angular/pull/64225)) | ##### migrations | Commit | Type | Description | | ------------------------------------------------------------------------------------------------ | ---- | ----------------------------------------------------------------------------------------------------------------------------------- | | [65884895ff](https://redirect.github.com/angular/angular/commit/65884895fff5bc499974849e9ec5a5792eb9e36c) | fix | preserve component imports when pruning NgModules in standalone migration ([#​64186](https://redirect.github.com/angular/angular/pull/64186)) | <!-- CHANGELOG SPLIT MARKER --> ### [`v20.3.3`](https://redirect.github.com/angular/angular/blob/HEAD/CHANGELOG.md#2033-2025-10-02) [Compare Source](https://redirect.github.com/angular/angular/compare/20.3.2...20.3.3) ##### compiler | Commit | Type | Description | | ------------------------------------------------------------------------------------------------ | ---- | ----------------------------------------------------------------------------------------------------------- | | [f51ab32fb3](https://redirect.github.com/angular/angular/commit/f51ab32fb3000ae34c077b049ff2f7b8e3e22d14) | fix | recover template literals with broken expressions ([#​64150](https://redirect.github.com/angular/angular/pull/64150)) | ##### core | Commit | Type | Description | | ------------------------------------------------------------------------------------------------ | ---- | -------------------------------------------------------------------------------------------------------------------------------- | | [542cd0019a](https://redirect.github.com/angular/angular/commit/542cd0019aa509e399282ccf7cb5fa6208cef70e) | fix | do not rename ARIA property bindings to attributes ([#​64089](https://redirect.github.com/angular/angular/pull/64089)) | | [0e928fbc4a](https://redirect.github.com/angular/angular/commit/0e928fbc4a351303c4ce081a679f4a38c0acd5e6) | fix | Fixes animations in conjunction with content projection ([#​63776](https://redirect.github.com/angular/angular/pull/63776)) | | [e5157bd933](https://redirect.github.com/angular/angular/commit/e5157bd933c41836fb431659f42dfb4cdbe0d2d1) | fix | prevents unintended early termination of leave animations and hoisting ([#​64088](https://redirect.github.com/angular/angular/pull/64088)) | ##### migrations | Commit | Type | Description | | ------------------------------------------------------------------------------------------------ | ---- | ------------------------------------------------------------------------------------------------------------ | | [1710cbd7d4](https://redirect.github.com/angular/angular/commit/1710cbd7d484ccd5e9ab39b95a44e2d222f4262d) | fix | handle shorthand property declarations in NgModule ([#​64160](https://redirect.github.com/angular/angular/pull/64160)) | | [77b6305a4b](https://redirect.github.com/angular/angular/commit/77b6305a4b5db88f9c1130acf80095b502a0eca1) | fix | skip migration for inputs with 'this' references ([#​64142](https://redirect.github.com/angular/angular/pull/64142)) | <!-- CHANGELOG SPLIT MARKER --> ### [`v20.3.2`](https://redirect.github.com/angular/angular/blob/HEAD/CHANGELOG.md#2032-2025-09-24) [Compare Source](https://redirect.github.com/angular/angular/compare/20.3.1...20.3.2) ##### compiler-cli | Commit | Type | Description | | ------------------------------------------------------------------------------------------------ | ---- | ------------------------------------------------------------------------------------------------- | | [ba40153ac0](https://redirect.github.com/angular/angular/commit/ba40153ac07fc721585a1224fda09a654672cb74) | fix | capture metadata for undecorated fields ([#​63904](https://redirect.github.com/angular/angular/pull/63904)) | | [1d4f81c8ee](https://redirect.github.com/angular/angular/commit/1d4f81c8eedf5ea69c51c720f8dc5c5d12a62ba2) | fix | resolve import alias in defer blocks ([#​63966](https://redirect.github.com/angular/angular/pull/63966)) | ##### core | Commit | Type | Description | | ------------------------------------------------------------------------------------------------ | ---- | -------------------------------------------------------------------------------------------------------------------- | | [9515a70933](https://redirect.github.com/angular/angular/commit/9515a709331883f0ca9857ed46a5262b01979a26) | fix | fix narrowing of `Resource.hasValue()` ([#​63994](https://redirect.github.com/angular/angular/pull/63994)) | | [e78451cf8a](https://redirect.github.com/angular/angular/commit/e78451cf8a48322879e83b33fecc0b5854947afb) | fix | prevent animations renderer from impacting `animate.leave` ([#​63921](https://redirect.github.com/angular/angular/pull/63921)) | ##### forms | Commit | Type | Description | | ------------------------------------------------------------------------------------------------ | ---- | ------------------------------------------------------------------------------------------------------ | | [1fd8d5d446](https://redirect.github.com/angular/angular/commit/1fd8d5d446f909a16a127ba117a0f423c7a5db0c) | fix | Emit `FormResetEvent` when resetting control ([#​64034](https://redirect.github.com/angular/angular/pull/64034)) | ##### migrations | Commit | Type | Description | | ------------------------------------------------------------------------------------------------ | ---- | ----------------------------------------------------------------------------------------------------------- | | [16d0d43ad4](https://redirect.github.com/angular/angular/commit/16d0d43ad4903b69b8dcd9b76c48b5089e7f82ee) | fix | handle import aliases to the same module name ([#​63934](https://redirect.github.com/angular/angular/pull/63934)) | | [3ebaeccb46](https://redirect.github.com/angular/angular/commit/3ebaeccb466119ee43eeaa486f5e132c85e9caa2) | fix | handle reused templates in control flow migration ([#​63996](https://redirect.github.com/angular/angular/pull/63996)) | <!-- CHANGELOG SPLIT MARKER --> ### [`v20.3.1`](https://redirect.github.com/angular/angular/blob/HEAD/CHANGELOG.md#2031-2025-09-17) [Compare Source](https://redirect.github.com/angular/angular/compare/20.3.0...20.3.1) ##### compiler | Commit | Type | Description | | ------------------------------------------------------------------------------------------------ | ---- | ---------------------------------------------------------------------------------------- | | [7fb5a8087e](https://redirect.github.com/angular/angular/commit/7fb5a8087ee8fb0451cedbe6ac4ce972eca4b56e) | fix | Add support for `aria-invalid` ([#​63748](https://redirect.github.com/angular/angular/pull/63748)) | ##### compiler-cli | Commit | Type | Description | | ------------------------------------------------------------------------------------------------ | ---- | --------------------------------------------------------------------------------------------------------------------------------------- | | [8843707919](https://redirect.github.com/angular/angular/commit/88437079190cef9ee522a3e2defa6e2672c2d030) | fix | only bind inputs that are part of microsyntax to a structural directive ([#​52453](https://redirect.github.com/angular/angular/pull/52453)) | | [38c9921ff3](https://redirect.github.com/angular/angular/commit/38c9921ff387d235981a79e26dc8bc7e60a2e10c) | fix | signal not invoked diagnostic not raised when input has same name in template ([#​63754](https://redirect.github.com/angular/angular/pull/63754)) | ##### core | Commit | Type | Description | | ------------------------------------------------------------------------------------------------ | ---- | ------------------------------------------------------------------------------------------------------------------- | | [802dbcc2a0](https://redirect.github.com/angular/angular/commit/802dbcc2a0c5d3784cb04b4c78ea71ed0925327c) | fix | prevent animation events from being cleaned up on destroy ([#​63414](https://redirect.github.com/angular/angular/pull/63414)) | | [3ec8a5c753](https://redirect.github.com/angular/angular/commit/3ec8a5c7536cdd2c1db7db4bfbc2d4995156a833) | fix | Prevent leave animations on a move operation ([#​63745](https://redirect.github.com/angular/angular/pull/63745)) | ##### migrations | Commit | Type | Description | | ------------------------------------------------------------------------------------------------ | ---- | ------------------------------------------------------------------------------------------ | | [6e54bdfdcb](https://redirect.github.com/angular/angular/commit/6e54bdfdcb01522ee46865fadec911f960fff730) | fix | fix route-lazy-loading migration ([#​63818](https://redirect.github.com/angular/angular/pull/63818)) | <!-- CHANGELOG SPLIT MARKER --> ### [`v20.3.0`](https://redirect.github.com/angular/angular/blob/HEAD/CHANGELOG.md#2030-2025-09-10) [Compare Source](https://redirect.github.com/angular/angular/compare/20.2.4...20.3.0) #### Breaking Changes ##### core - The server-side bootstrapping process has been changed to eliminate the reliance on a global platform injector. Before: ```ts const bootstrap = () => bootstrapApplication(AppComponent, config); ``` After: ```ts const bootstrap = (context: BootstrapContext) => bootstrapApplication(AppComponent, config, context); ``` A schematic is provided to automatically update `main.server.ts` files to pass the `BootstrapContext` to the `bootstrapApplication` call. In addition, `getPlatform()` and `destroyPlatform()` will now return `null` and be a no-op respectively when running in a server environment. (cherry picked from commit [`8bf80c9`](https://redirect.github.com/angular/angular/commit/8bf80c9d2314b4f2bcf3df83ae01552a6fc49834)) ##### | Commit | Type | Description | | ------------------------------------------------------------------------------------------------ | ---- | ------------------------------------------------------------------------------------------------------- | | [a3f808d7c8](https://redirect.github.com/angular/angular/commit/a3f808d7c8cc59a4fd69f2e4b8d21a6510efa046) | fix | remove refresh button from transfer state tab ([#​63592](https://redirect.github.com/angular/angular/pull/63592)) | ##### core | Commit | Type | Description | | ------------------------------------------------------------------------------------------------ | ---- | ------------------------------------------------------------------------------------------------------------------------ | | [6117ccee2e](https://redirect.github.com/angular/angular/commit/6117ccee2e1507fb00549cd70e064282645db803) | feat | introduce `BootstrapContext` for improved server bootstrapping ([#​63636](https://redirect.github.com/angular/angular/pull/63636)) | <!-- CHANGELOG SPLIT MARKER --> ### [`v20.2.4`](https://redirect.github.com/angular/angular/blob/HEAD/CHANGELOG.md#2024-2025-09-03) [Compare Source](https://redirect.github.com/angular/angular/compare/20.2.3...20.2.4) ##### core | Commit | Type | Description | | ------------------------------------------------------------------------------------------------ | ---- | ------------------------------------------------------------------------------------------------------------------------------- | | [dc64f3e478](https://redirect.github.com/angular/angular/commit/dc64f3e478c5cc1e354a0ff7cf5965b817b345d6) | fix | Fixed inject migration schematics for migrate destructured properties ([#​62832](https://redirect.github.com/angular/angular/pull/62832)) | ##### platform-server | Commit | Type | Description | | ------------------------------------------------------------------------------------------------ | ---- | ----------------------------------------------------------------------------------------------------------------- | | [d1d32db972](https://redirect.github.com/angular/angular/commit/d1d32db97260c1e57c2937588002feb4271c7774) | fix | prevent false warning for duplicate state serialization ([#​63525](https://redirect.github.com/angular/angular/pull/63525)) | <!-- CHANGELOG SPLIT MARKER --> ### [`v20.2.3`](https://redirect.github.com/angular/angular/blob/HEAD/CHANGELOG.md#2023-2025-08-29) [Compare Source](https://redirect.github.com/angular/angular/compare/20.2.2...20.2.3) ##### compiler | Commit | Type | Description | | ------------------------------------------------------------------------------------------------ | ---- | ---------------------------------------------------------------------------------------------------------------- | | [479a919f42](https://redirect.github.com/angular/angular/commit/479a919f42517193653384220adab5b89dd74e3d) | fix | fixes regression with event parsing and animate prefix ([#​63470](https://redirect.github.com/angular/angular/pull/63470)) | ##### core | Commit | Type | Description | | ------------------------------------------------------------------------------------------------ | ---- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- | | [f87fad3fff](https://redirect.github.com/angular/angular/commit/f87fad3fff62cebf2868e06cba48e0f27b719d24) | fix | avoid injecting internal error handler from a destroyed injector ([#​62275](https://redirect.github.com/angular/angular/pull/62275)) | | [114906d2d6](https://redirect.github.com/angular/angular/commit/114906d2d68d98c98961d858abd3ae714d4809a3) | fix | Fix cancellation of animation enter classes ([#​63442](https://redirect.github.com/angular/angular/pull/63442)) | | [596b545130](https://redirect.github.com/angular/angular/commit/596b5451309b8ce4f08a1cd36e6b3610507d52f9) | fix | Prevent an error on cleanup when an `rxResource` `stream` threw before returning an `Observable` ([#​63342](https://redirect.github.com/angular/angular/pull/63342)) | <!-- CHANGELOG SPLIT MARKER --> ### [`v20.2.2`](https://redirect.github.com/angular/angular/blob/HEAD/CHANGELOG.md#2022-2025-08-27) [Compare Source](https://redirect.github.com/angular/angular/compare/20.2.1...20.2.2) ##### compiler | Commit | Type | Description | | ------------------------------------------------------------------------------------------------ | ---- | ----------------------------------------------------------------------------------------------------------------- | | [d7b6045d61](https://redirect.github.com/angular/angular/commit/d7b6045d61582d20a17802e769dc1441984988f0) | fix | fixes animations on elements with structural directives ([#​63390](https://redirect.github.com/angular/angular/pull/63390)) | ##### core | Commit | Type | Description | | ------------------------------------------------------------------------------------------------ | ---- | --------------------------------------------------------------------------------------------------------------- | | [6c421ed65d](https://redirect.github.com/angular/angular/commit/6c421ed65d050765a18eafc51fe7257abc5682ce) | fix | Ensures `@for` loop animations never get cancelled ([#​63328](https://redirect.github.com/angular/angular/pull/63328)) | | [9093e0e132](https://redirect.github.com/angular/angular/commit/9093e0e132f99c2b590c31b299871bcd493b7de0) | fix | fix memory leak with leaving nodes tracking ([#​63328](https://redirect.github.com/angular/angular/pull/63328)) | | [c8f07daf8f](https://redirect.github.com/angular/angular/commit/c8f07daf8f2c7e8c6641eb4368379a3f5f1d1f52) | fix | Fixes `animate.leave` binding to a string with spaces ([#​63366](https://redirect.github.com/angular/angular/pull/63366)) | <!-- CHANGELOG SPLIT MARKER --> ### [`v20.2.1`](https://redirect.github.com/angular/angular/blob/HEAD/CHANGELOG.md#2021-2025-08-21) [Compare Source](https://redirect.github.com/angular/angular/compare/20.2.0...20.2.1) ##### compiler | Commit | Type | Description | | ------------------------------------------------------------------------------------------------ | ---- | ------------------------------------------------------------------------------------------------------------ | | [a28672fb70](https://redirect.github.com/angular/angular/commit/a28672fb7017cc62e42829c5910c3b39373d7913) | fix | Keep paraenthesis in Nullish + Boolean expression. ([#​63292](https://redirect.github.com/angular/angular/pull/63292)) | <!-- CHANGELOG SPLIT MARKER --> ### [`v20.2.0`](https://redirect.github.com/angular/angular/blob/HEAD/CHANGELOG.md#2020-2025-08-20) [Compare Source](https://redirect.github.com/angular/angular/compare/20.1.8...20.2.0) #### Deprecations ##### animations - [@​angular/animations](https://redirect.github.com/angular/animations) ##### core - [@​angular/animations](https://redirect.github.com/angular/animations) ##### router - The Router.getCurrentNavigation method is deprecated. Use the Router.currentNavigation signal instead. - The Router.getCurrentNavigation method is deprecated. Use the Router.currentNavigation signal instead. ##### animations | Commit | Type | Description | | ------------------------------------------------------------------------------------------------ | -------- | ------------------------------------------------------------------------------------------ | | [9766116cea](https://redirect.github.com/angular/angular/commit/9766116cea69607d80144251a599f1cc1b12e02c) | refactor | deprecate the animations package ([#​62795](https://redirect.github.com/angular/angular/pull/62795)) | ##### compiler | Commit | Type | Description | | ------------------------------------------------------------------------------------------------ | ---- | ------------------------------------------------------------------------------------------------------------------- | | [7767aa640c](https://redirect.github.com/angular/angular/commit/7767aa640c542f5058df9322f2bbe974fa8d3c81) | fix | allow more characters in square-bracketed attribute names ([#​62742](https://redirect.github.com/angular/angular/pull/62742)) | | [7b51728813](https://redirect.github.com/angular/angular/commit/7b517288139aec166e5e5b60e84b1e22e3d6b70f) | fix | fixes animation event host bindings not firing ([#​63217](https://redirect.github.com/angular/angular/pull/63217)) | ##### compiler-cli | Commit | Type | Description | | ------------------------------------------------------------------------------------------------ | ---- | --------------------------------------------------------------------------------------------------------------------------------- | | [5abfe4a899](https://redirect.github.com/angular/angular/commit/5abfe4a8999e42ad44e6f1d4414f241094bb8fdb) | feat | add diagnostic for uninvoked functions in text interpolation ([#​59191](https://redirect.github.com/angular/angular/pull/59191)) | | [c4917074f1](https://redirect.github.com/angular/angular/commit/c4917074f1e278ea24948a8810b3d4f306765174) | fix | display proper function in NG8117 message ([#​62842](https://redirect.github.com/angular/angular/pull/62842)) | | [812463c563](https://redirect.github.com/angular/angular/commit/812463c5636effe5bd5ba5c7c7fc65c3cc08d047) | fix | Ignore diagnostics on ngTemplateContextGuard lines in TCB ([#​63054](https://redirect.github.com/angular/angular/pull/63054)) | | [45b030b5ce](https://redirect.github.com/angular/angular/commit/45b030b5ce1e116a88fe1c2fe133f654fb1f66c5) | fix | prevent dom event assertion in TCB generation on older angular versions ([#​63053](https://redirect.github.com/angular/angular/pull/63053)) | ##### core | Commit | Type | Description | | ------------------------------------------------------------------------------------------------ | -------- | --------------------------------------------------------------------------------------------------------------------------- | | [6b1f4b9e8b](https://redirect.github.com/angular/angular/commit/6b1f4b9e8bb981377e271e6af0d9768ff7f765e9) | feat | add enter and leave animation instructions ([#​62682](https://redirect.github.com/angular/angular/pull/62682)) | | [cec91c0035](https://redirect.github.com/angular/angular/commit/cec91c00356ee3974c39c9471b243a2a16149f5b) | feat | add option to infer the tag names of components in tests ([#​62283](https://redirect.github.com/angular/angular/pull/62283)) | | [141bb75ff2](https://redirect.github.com/angular/angular/commit/141bb75ff241425a93ce5b60b56a4247e67d7648) | feat | Promote zoneless to stable ([#​62699](https://redirect.github.com/angular/angular/pull/62699)) | | [4138aca91f](https://redirect.github.com/angular/angular/commit/4138aca91fe828f0cfbd779d0c456cdea7703bdc) | feat | render ARIA property bindings as attributes ([#​62630](https://redirect.github.com/angular/angular/pull/62630)) | | [a409534d6c](https://redirect.github.com/angular/angular/commit/a409534d6c3d7cb4472afffd6b17df8c25e34106) | feat | support `as` aliases on `else if` blocks ([#​63047](https://redirect.github.com/angular/angular/pull/63047)) | | [745ea44394](https://redirect.github.com/angular/angular/commit/745ea4439465494ab5b7002dd1fa320cd32220fb) | feat | support TypeScript 5.9 ([#​62541](https://redirect.github.com/angular/angular/pull/62541)) | | [593cc8a368](https://redirect.github.com/angular/angular/commit/593cc8a3684dfb163bfffa265c5efb3bc7efacd1) | fix | checks if body exists before continuing ([#​62768](https://redirect.github.com/angular/angular/pull/62768)) | | [bdc31675b7](https://redirect.github.com/angular/angular/commit/bdc31675b7e5f37d2b312c766fe4963305620bdf) | fix | ensure animate events do not have duplicate elements ([#​63216](https://redirect.github.com/angular/angular/pull/63216)) | | [de3a0c5cf3](https://redirect.github.com/angular/angular/commit/de3a0c5cf3f87782fa63d30edf6ac05eb6be9fac) | fix | Fix `animate.enter` class removal when composing classes ([#​62981](https://redirect.github.com/angular/angular/pull/62981)) | | [6597ac0af7](https://redirect.github.com/angular/angular/commit/6597ac0af78ac2224ec2f9a37283b53aee11abe1) | fix | fix support for space separated strings in leave animations ([#​62979](https://redirect.github.com/angular/angular/pull/62979)) | | [ebd622b344](https://redirect.github.com/angular/angular/commit/ebd622b3449789b72efc8295244ca924a299e7c1) | fix | fixes empty animations when recalculating styles ([#​63007](https://redirect.github.com/angular/angular/pull/63007)) | | [455b147488](https://redirect.github.com/angular/angular/commit/455b147488dc0a064c0ca13a96a4df3c3ed01152) | fix | fixes timing issues with enter animations ([#​62925](https://redirect.github.com/angular/angular/pull/62925)) | | [f9d73cc687](https://redirect.github.com/angular/angular/commit/f9d73cc6877d516da4ab4704c21bb19164123fa1) | fix | handle cases where classes added have no animations ([#​63242](https://redirect.github.com/angular/angular/pull/63242)) | | [6a1184600c](https://redirect.github.com/angular/angular/commit/6a1184600ce0fc7a3f338d6766612e9510ef5518) | fix | prevents duplicate nodes when `@if` toggles with leave animations ([#​63048](https://redirect.github.com/angular/angular/pull/63048)) | | [063b5e166f](https://redirect.github.com/angular/angular/commit/063b5e166f66bce1abd06c258242212009e76cca) | fix | switch check to documentElement with chaining ([#​62773](https://redirect.github.com/angular/angular/pull/62773)) | | [320de4e96d](https://redirect.github.com/angular/angular/commit/320de4e96d250cad1ce2c9f8c0fa2022da53b734) | refactor | deprecate animations field on component interface ([#​62895](https://redirect.github.com/angular/angular/pull/62895)) | ##### forms | Commit | Type | Description | | ------------------------------------------------------------------------------------------------ | ---- | ------------------------------------------------------------------------------------------------------------------- | | [c353497a01](https://redirect.github.com/angular/angular/commit/c353497a01776cd702af6c5136fdae5fc6ce94d5) | feat | add support for pushing an array of controls to formarray ([#​57102](https://redirect.github.com/angular/angular/pull/57102)) | ##### http | Commit | Type | Description | | ------------------------------------------------------------------------------------------------ | ---- | ----------------------------------------------------------------------------------------------------------------------------- | | [0984b30388](https://redirect.github.com/angular/angular/commit/0984b30388ef51dfad66f1228f665b89b73ef3fb) | feat | Add redirected property to HttpResponse and HttpErrorResponse ([#​62675](https://redirect.github.com/angular/angular/pull/62675)) | | [be811fee79](https://redirect.github.com/angular/angular/commit/be811fee7925fb482567fa7cd9d485ac28acdade) | feat | add referrer & integrity support for fetch requests in httpResource ([#​62461](https://redirect.github.com/angular/angular/pull/62461)) | | [1cf9d9064c](https://redirect.github.com/angular/angular/commit/1cf9d9064c15c00071ece3b78c8019035a6db6ce) | feat | Add support for fetch referrer & integrity options in HttpClient ([#​62417](https://redirect.github.com/angular/angular/pull/62417)) | | [1408baff45](https://redirect.github.com/angular/angular/commit/1408baff453e636da05838fa17c6e4abd86c4b72) | fix | Add missing timeout and transferCache options to `HttpClient` ([#​62586](https://redirect.github.com/angular/angular/pull/62586)) | ##### language-service | Commit | Type | Description | | ------------------------------------------------------------------------------------------------ | ---- | -------------------------------------------------------------------------------------------------------------- | | [c81e345e72](https://redirect.github.com/angular/angular/commit/c81e345e726b5b281621159c789e6d80a9f328e2) | feat | support auto-import for attribute completions ([#​62797](https://redirect.github.com/angular/angular/pull/62797)) | | [d64dd27a02](https://redirect.github.com/angular/angular/commit/d64dd27a02630b631bc9890d7292d4683493cb65) | feat | support to report the deprecated API in the template ([#​62054](https://redirect.github.com/angular/angular/pull/62054)) | | [591c7e2ec8](https://redirect.github.com/angular/angular/commit/591c7e2ec82c6669ffa6e0011b8a0a4fc12e9c3a) | fix | Support to resolve the re-export component. ([#​62585](https://redirect.github.com/angular/angular/pull/62585)) | ##### platform-browser | Commit | Type | Description | | ------------------------------------------------------------------------------------------------ | ---- | ---------------------------------------------------------------------------------------------------------------- | | [52b8e07d6e](https://redirect.github.com/angular/angular/commit/52b8e07d6e568a527fae18a8a867dacdf8053e20) | feat | Warns on conflicting hydration and blocking navigation ([#​62963](https://redirect.github.com/angular/angular/pull/62963)) | ##### router | Commit | Type | Description | | ------------------------------------------------------------------------------------------------ | ---- | ------------------------------------------------------------------------------------------------------------------- | | [d00b3fed58](https://redirect.github.com/angular/angular/commit/d00b3fed58496369d9f3a1ac0d74416a586be78b) | feat | add a `currentNavigation` signal to the `Router` service. ([#​62971](https://redirect.github.com/angular/angular/pull/62971)) | | [687c374826](https://redirect.github.com/angular/angular/commit/687c374826c5e9ea91839c20f0df815ce085c583) | feat | add a currentNavigation signal to the Router service. ([#​63011](https://redirect.github.com/angular/angular/pull/63011)) | | [9c45c322d1](https://redirect.github.com/angular/angular/commit/9c45c322d1ac3b05c916b7c956263066fb9be47f) | fix | ensure preloaded components are properly activated ([#​62502](https://redirect.github.com/angular/angular/pull/62502)) | ##### service-worker | Commit </details> --- ### Configuration 📅 **Schedule**: Branch creation - "" (UTC), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/open-feature/js-sdk). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi4xOS45IiwidXBkYXRlZEluVmVyIjoiNDIuMzIuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==--> Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [@types/react](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/react) ([source](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react)) | [`18.3.18` -> `18.3.27`](https://renovatebot.com/diffs/npm/@types%2freact/18.3.18/18.3.27) |  |  | --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/open-feature/js-sdk). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi4xOS45IiwidXBkYXRlZEluVmVyIjoiNDIuMzIuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==--> Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
…#1305) ## This PR Updates the no-op logic in useContextMutator's setContext method to compare against the actual previous context as returned by OpenFeature itself, rather than just the previous context that that specific use of useContextMutator had in its ref (#1301 (comment)). Building on #1301, this should allow for setContext to be called with a method, and for that method to return the context it was provided, to guarantee a no-op always. Signed-off-by: MattIPv4 <me@mattcowley.co.uk> Co-authored-by: Lukas Reining <lukas.reining@codecentric.de>
## This PR As identified in #1305 (comment), the signature + JSDoc for this hook method indicates it returns a Promise you can await for the context change, however, the actual logic within the method did not await the underlying setContext calls -- it now does. Signed-off-by: MattIPv4 <me@mattcowley.co.uk>
🤖 I have created a release *beep* *boop* --- ## [1.20.1](server-sdk-v1.20.0...server-sdk-v1.20.1) (2025-12-09) ### 🐛 Bug Fixes * multi-provider hook context management ([#1282](#1282)) ([2f9e0d3](2f9e0d3)) ### 🧹 Chore * update copyright to OpenFeature Maintainers ([#1283](#1283)) ([d751b8b](d751b8b)) ### 📚 Documentation * add Multi-Provider to features list in README's ([#1269](#1269)) ([752fa0d](752fa0d)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com>
🤖 I have created a release *beep* *boop* --- ## [1.7.2](web-sdk-v1.7.1...web-sdk-v1.7.2) (2025-12-09) ### 🧹 Chore * update copyright to OpenFeature Maintainers ([#1283](#1283)) ([d751b8b](d751b8b)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com> Signed-off-by: Todd Baert <todd.baert@dynatrace.com> Co-authored-by: Todd Baert <todd.baert@dynatrace.com>
🤖 I have created a release *beep* *boop* --- ## [1.1.0](react-sdk-v1.0.2...react-sdk-v1.1.0) (2025-12-09) ### ✨ New Features * allow method to be passed into setContext hook ([#1301](#1301)) ([279f9bf](279f9bf)) ### 🐛 Bug Fixes * await context change in useContextMutator setContext ([#1306](#1306)) ([7ef721a](7ef721a)) * compare full EvaluationDetails to prevent stale data ([#1287](#1287)) ([8133a4f](8133a4f)) * in-line docs, un-needed AbortController creation ([#1291](#1291)) ([9b05be9](9b05be9)) * use actual previous context to noop useContextMutator setContext ([#1305](#1305)) ([4d15a86](4d15a86)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com>
## This PR Enables Prettier for the repository, adding scripts to the root package for checking + applying formatting. Adds a new CI job to check formatting on PRs (and also moves the lint to there, as I don't think lint needs to run across the Node.js version matrix). I've also added husky + lint-staged to automatically run Prettier against files being committed locally, but happy to pull that back out if folks would prefer not to have that. ### Related Issues Resolves #1302 ### Notes I'd recommend reviewing the commits individually, except the last commit, which was just the result of actually running Prettier. --------- Signed-off-by: MattIPv4 <me@mattcowley.co.uk> Co-authored-by: Lukas Reining <lukas.reining@codecentric.de>
<!-- Please use this template for your pull request. --> <!-- Please use the sections that you need and delete other sections --> ## This PR This PR removes the explicit `JSX.Element` return type from the type signature of the React SDK `OpenFeatureProvider`. `JSX.Element` is narrow for React 19+ as types have widened to include Portals etc. & this was throwing TS compilation errors ### Related Issues Fixes #1307 ### Notes As this is purely a type change I didn't feel it necessary to add additional tests, happy to investigate further if required though Signed-off-by: Sam <sam@andomain.co.uk>
## This PR Adds Angular 21 support ### Related Issues Fixes #1314 ### Notes @angular-eslint has also been updated to v21 --------- Signed-off-by: Charles Capon <charles.capon@edf.fr>
🤖 I have created a release *beep* *boop* --- ## [0.0.20](angular-sdk-v0.0.19...angular-sdk-v0.0.20) (2025-12-16) ### ✨ New Features * Angular 21 support ([#1316](#1316)) ([7d1bfb2](7d1bfb2)) ### 🧹 Chore * mention debounce hook in react/ng docs ([#1272](#1272)) ([27666b8](27666b8)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com>
## This PR - Remove redundant loop for updating the before hook contexts - Add simple test case to make sure the same object reference is being updated ### Related Issues <!-- add here the GitHub issue that this PR resolves if applicable --> #1236 ### Notes The accumulated evaluation context object is shared with all the hooks (same object reference). This makes the inner for loop for updating the contexts redundant ### How to test ```npm run test``` --------- Signed-off-by: Marko Mlakar <markomlakar2@gmail.com> Signed-off-by: MarkoMlakar <marko.mlakar@dynatrace.com>
## This PR Introduces the FeatureFlag component for React that allow using feature flags in a declarative manner ### Related Issues No ticket ### Notes Maybe consider adding a similar component for other supported frameworks? ### Follow-up Tasks <!-- anything that is related to this PR but not done here should be noted under this section --> <!-- if there is a need for a new issue, please link it here --> ### How to test I have written unit tests to cover the main features of the component --------- Signed-off-by: Todd Baert <todd.baert@dynatrace.com> Co-authored-by: Lukas Reining <lukas.reining@codecentric.de> Co-authored-by: marcozabel <marco.zabel@dynatrace.com> Co-authored-by: Todd Baert <todd.baert@dynatrace.com> Co-authored-by: Michael Beemer <beeme1mr@users.noreply.github.com>
Signed-off-by: Michael Beemer <beeme1mr@users.noreply.github.com>
<!-- Please use this template for your pull request. --> <!-- Please use the sections that you need and delete other sections --> ## This PR This PR is adding evaluation options to the FeatureFlag component to allow the use of suspend options. ### Related Issues <!-- add here the GitHub issue that this PR resolves if applicable --> #1321 ### Notes <!-- any additional notes for this PR --> ### Follow-up Tasks <!-- anything that is related to this PR but not done here should be noted under this section --> <!-- if there is a need for a new issue, please link it here --> ### How to test <!-- if applicable, add testing instructions under this section --> --------- Signed-off-by: marcozabel <marco.zabel@dynatrace.com>
0a63931 to
c24d7e6
Compare
Signed-off-by: Jonathan Norris <jonathan@taplytics.com>
…types Signed-off-by: Jonathan Norris <jonathan@taplytics.com>
Signed-off-by: Jonathan Norris <jonathan@taplytics.com>
Signed-off-by: Jonathan Norris <jonathan@taplytics.com>
c24d7e6 to
52d8268
Compare
- Remove redundant 'provider as Provider' casts where type is already known - Add proper type definitions for StatusTracker enums to eliminate 'as TProviderEvents' casts - Use variable narrowing for optional Reconciling event/status Signed-off-by: Jonathan Norris <jonathan@taplytics.com>
These files are now obsolete as the types are imported from the shared @openfeature/core package. Signed-off-by: Jonathan Norris <jonathan@taplytics.com>
- Add comprehensive tests for StatusTracker event handling and status priority - Add tests for constructAggregateError including empty array edge case - Add tests for throwAggregateErrorFromPromiseResults - Fix AggregateError prototype chain for proper instanceof checks Signed-off-by: Jonathan Norris <jonathan@taplytics.com>
Keep AllProviderStatus as an alias of ClientProviderStatus instead of creating a new enum, to maintain backward compatibility. Signed-off-by: Jonathan Norris <jonathan@taplytics.com>
Signed-off-by: Jonathan Norris <jonathan@taplytics.com>
…ic API - Create FirstMatchStrategy, FirstSuccessfulStrategy, ComparisonStrategy wrapper classes in server and web SDKs with ProviderStatus pre-bound - Rename base strategies to BaseFirstMatchStrategy, etc. in @openfeature/core - Update READMEs with simplified custom strategy documentation - Users can now use strategies without passing ProviderStatus: new FirstMatchStrategy() instead of new FirstMatchStrategy(ProviderStatus) Signed-off-by: Jonathan Norris <jonathan@taplytics.com>
849f66a to
97eb2ea
Compare
Signed-off-by: Jonathan Norris <jonathan@taplytics.com>
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Summary
Refactors the multi-provider implementation by moving duplicate code from
@openfeature/server-sdkand@openfeature/web-sdkinto@openfeature/shared.Changes
Moved to shared package:
StatusTracker- Generic status tracking for multiple providersBaseEvaluationStrategyand concrete strategy implementations (FirstMatchStrategy,FirstSuccessfulStrategy,ComparisonStrategy)ProviderEntryInput,RegisteredProvider)Made generic and type-safe:
TProviderStatus,TProvider)anytypes in favor of explicit generic constraintsStatusTrackerfor provider compatibilityUpdated implementations:
ProviderStatus,Provider) when using shared utilities